__NOTOC__
== 电源突然失效对文件系统的可能的影响 ==

电源突然失效会导致计算机运行中断，这可能会造成文件系统损坏。原因主要涉及以下几个方面：

=== 未完成的数据写入操作 ===
* 当电源突然断开时，所有正在进行的数据写入操作会立即中断。这可能导致文件部分写入或根本未写入，从而产生不完整或损坏的文件。

=== 文件系统元数据metadata损坏 ===
* 文件系统使用元数据（如文件分配表、索引节点、目录结构等）来追踪硬盘上的文件。如果在更新这些元数据时发生断电，可能导致文件系统结构损坏。

=== 数据缓存丢失 ===
* 为了提高效率，操作系统通常会将数据缓存在内存中，随后再写入硬盘。断电会导致这些尚未写入硬盘的缓存数据丢失。

=== 日志或事务的中断 ===
* 许多现代文件系统使用日志或事务日志系统来保证操作的完整性。断电可能中断这些日志或事务的处理，导致文件系统状态不一致。

=== 控制器损坏===
* SSD和eMMC都有内置的控制器，用于管理数据存储和检索。电源失效可能导致这些控制器的固件损坏或状态异常。

===  Wear Leveling和Garbage Collection / 潜在SSD中的FTL（Flash Translation Layer）损坏 ===
* SSDs和eMMCs利用wear leveling和garbage collection算法来延长寿命。断电可能在这些操作执行过程中发生，进一步增加对存储单元的损害。


== 预防措施 ==
为防止电源失效导致的文件系统损坏，可以采取以下措施：
* 使用不间断电源（UPS）。
* 定期备份重要数据。
* 定期运行文件系统检查和维护程序。
* Overlay/（只读） 文件系统。


==Overlay rootfs （只读操作系统的一种实现方法）==
[[File:OverlayFS_Image.png|thumb|right|400px|OverlayFS]]
"Overlay rootfs" 或 OverlayFS（Overlay 根文件系统/文件系统）是指在 Linux 系统中使用的一种技术，它允许在现有的文件系统之上叠加一个额外的文件系统层。实现一个面向其他文件系统的联合挂载。

OverlayFS 可以将一个或多个可写或只读的文件系统叠加在一起，形成单个统一的文件系统。在 OverlayFS 中，有两个主要的概念：Lower Layer 和 Upper Layer。

* '''Lower Layer''': 通常是只读的，包含原始数据。可以是一个或多个只读层。
* '''Upper Layer''': 是可写的，用于存储对文件的更改和新文件。如果不存在上层，OverlayFS 可以用于创建一个纯粹的只读文件系统。我们这里挂载在 <code>tmpfs</code>下
* '''OverlayFS''' 合并的文件系统，Linux 所有的读写操作的在overlay上操作，但是内部通过overlay机制，'''读操作'''：当你尝试读取一个文件时，OverlayFS首先检查上层是否有这个文件的修改版本。如果有，它就从上层读取。如果没有，它就从下层读取。'''写操作'''：当你写入或修改文件时，这些改动只会发生在上层。即使你在修改一个原本存储在下层的文件，OverlayFS也会先将该文件复制到上层，然后在上层进行修改。

OverlayFS的主要机制涉及当两个文件系统提供同一名称的目录时目录访问的合并。除此之外，OverlayFS呈现其中一个所产生的对象（如果有），“上层”文件系统优先。OverlayFS与其他覆盖型文件系统不同，OverlayFS合并的目录子树不一定是来自不同的文件系统。

此处使用OverlayFS来实现对rootfs的保护，即将上层文件系统放置于tmpfs(内存)中，断电随即清除。而基础的rootfs是只读的，不会因为有写入操作未完成而受到损坏。特别适合于创建只读系统，这在嵌入式系统、公共终端、或需要高安全性和稳定性的系统中特别有用。

注意：OverlayFS只能从软件层面保护rootfs，对于断电冲击造成的eMMC或者SSD的硬件或者固件损害没有保护作用！

==在NVIDIA Jetson Xavier NX设备上部署Overlay rootfs==

警告：本操作可能因为操作错误等原因造成<code>rootfs</code>错误而无法启动设备，请在进行操作前先备份eMMC上的数据！

本文档仅在'''JetPack 4.5.1'''上测试，其他版本可能存在/或不存在其他步骤或问题。

执行如下命令：
<pre>
sudo -s
mkdir -p /usr/share/initramfs-tools/hooks/
cat > /usr/share/initramfs-tools/hooks/copy_nv_usb_firmware <<EOF
#!/bin/sh -e

if [ "\$1" = "prereqs" ]; then exit 0; fi
. /usr/share/initramfs-tools/hook-functions

mkdir -p \$DESTDIR/lib/firmware
cp /lib/firmware/tegra18x_xusb_firmware \$DESTDIR/lib/firmware/
cp /lib/firmware/tegra19x_xusb_firmware \$DESTDIR/lib/firmware/
EOF
chmod +x /usr/share/initramfs-tools/hooks/copy_nv_usb_firmware
exit
</pre>

使用root用户编辑 <code>/etc/initramfs-tools/initramfs.conf</code>，找到 <code>MODULES=most</code> 一行，将其修改为 <code>MODULES=dep</code>。然后执行命令：
<pre>
sudo update-initramfs -u
</pre>

安装overlayroot (需要连接互联网)
<pre>
sudo apt-get update
sudo apt-get install overlayroot
</pre>

使用root用户编辑 <code>/boot/extlinux/extlinux.conf</code>，找到所有为 <code>INITRD /boot/initrd</code>的行，将其修改为 <code>INITRD /boot/initrd.img-4.9.201-tegra</code>。

使用root用户编辑 <code>/etc/overlayroot.conf</code>，找到 <code>overlayroot=""</code>, 按照如下方式修改：(若无此行则直接添加即可)
<pre>
overlayroot="tmpfs:swap=1,recurse=0"
</pre>

重启应用变更。

如果想要临时修改rootfs内容，使用以下命令：
<pre>
sudo overlayroot-chroot
</pre>

如果需要移除overlayroot（例如要对文件系统进行修改），使用<code>overlayroot-chroot</code>进入可写入的rootfs, 编辑 <code>/etc/overlayroot.conf</code>, 将变量 <code>overlayroot</code> 设置为 <code>overlayroot=""</code> ，并重启。


=== OverlayFS的大小限制及内存影响 ===

OverlayFS的大小限制和内存影响时，需要注意：

=== OverlayFS大小限制 ===
* 重要的是要注意，当OverlayFS的上层（upper layer）使用了内存（如tmpfs）时，其最大大小受到可用内存大小的限制。在许多配置中，这个上层的大小限制为系统总内存的一半。
* 这意味着OverlayFS可用于存储的数据量有限，并且依赖于系统当前的内存使用情况。

=== 内存抢占现象 ===
* 当OverlayFS的上层占用大量内存时，可能会出现内存抢占的现象。这是因为系统会尝试为OverlayFS分配内存，可能会影响到其他应用程序和系统进程的内存需求。
* 在内存受限的情况下，这可能导致系统性能下降，甚至可能导致其他应用程序崩溃或系统不稳定。

=== 修改Upper Layer 容量上限 ===
使用root用户编辑 <code>/etc/overlayroot.conf</code>，找到 <code>overlayroot=""</code>, 按照如下方式修改：(若无此行则直接添加即可)
<pre>
overlayroot="tmpfs:swap=1,recurse=0,size=1G"
</pre>

==测试OverlayFS是否安装成功==

要测试OverlayFS是否安装成功，可以按照以下步骤操作：

=== 检查内核版本 ===
* 首先，确认你的Linux内核支持OverlayFS。OverlayFS从Linux内核3.18版本开始提供。
* 执行命令查看内核版本：
  <code>uname -r</code>

=== 检查OverlayFS模块 ===
* 使用modinfo命令来检查OverlayFS模块是否存在：
  <code>modinfo overlay</code>
* 如果这个命令返回模块的信息，那么OverlayFS模块可用。

=== 测试OverlayFS功能 ===
* 在 <code>/</code> 目录中创建和修改文件，检查这些更改。
  <code>echo "Hello OverlayFS" > /testfile.txt</code>

* <code>cat /testfile.txt</code> 检查是否得到原来的内容。
  <code>Hello OverlayFS</code> 

* 重新启动<code>reboot</code>,查看 <code>cat /testfile.txt</code> 检查是否得到原来的内容。
  <code>bash: cat /testfile.txt: No such file or directory</code> 

如果文件不存在了，则表明测试已成功安装并且功能正常。

== 已制作好的OverlayFS的参考镜像 ==
可以下载我们已经制作完成测试image：

https://dl.ariaboard.com/nvidia_jetson_xavier_nx/JetPack_4.5.1_Linux_JETSON_XAVIER_NX-CVM-overlayroot-20240129.tar.xz

或者：

https://f.g77k.com/nvidia_jetson_nx/JetPack_4.5.1_Linux_JETSON_XAVIER_NX-CVM-overlayroot-20240129.tar.xz

= 在NVMe设备上创建并挂载Ext4分区 =

本文档指导如何在Linux系统的NVMe设备上创建一个新的ext4分区，并将其挂载到''/media/storage''目录下。此外，本指南还包括修改''/etc/fstab''文件的步骤，以将rootfs设置为可读写模式。

=== 前提条件 ===
* 已连接到NVMe设备的Linux系统。
* 已对所有重要数据进行了备份。

=== 步骤概述 ===

==== 1. 识别NVMe设备 ====
使用以下命令来识别您的NVMe设备：
<pre>
sudo fdisk -l
</pre>
找到名为''/dev/nvme0n1''（或类似）的设备。

==== 2. 创建新分区 ====
使用''gdisk''为NVMe设备创建一个新分区：
<pre>
sudo gdisk /dev/nvme0n1
</pre>
按照提示操作，选择分区类型并分配大小。建议使用GPT分区表以避免在大容量存储设备上出现问题。

==== 3. 格式化新分区 ====
格式化为ext4文件系统：
<pre>
sudo mkfs.ext4 /dev/nvme0n1p1
</pre>
将''/dev/nvme0n1p1''替换为您的实际分区名称。

==== 4. 临时进入可写入的rootfs ====
<pre>
sudo overlayroot-chroot
</pre>
成功后会临时进入可写入的rootfs并将当前用户切换为root用户。

==== 5. 创建挂载点 ====
创建''/media/storage''目录作为挂载点：
<pre>
mkdir /media/storage
</pre>

==== 6. 修改fstab (可选)====
为了在启动时自动挂载分区，编辑''/etc/fstab''文件：
<pre>
sudo nano /etc/fstab
</pre>
在文件中添加以下行以挂载新分区：
<pre>
/dev/nvme0n1p1 /media/storage ext4 defaults,nofail 0 2
</pre>

==== 7. 退出可写入的rootfs环境并重启设备 ====
<pre>
exit
sudo reboot
</pre>

==== 8. 挂载分区 (若已修改fstab则可跳过此步骤) ====
将新分区挂载到''/''目录：
<pre>
sudo mount /dev/nvme0n1p1 /media/storage
</pre>

==参考==
* https://docs.kernel.org/filesystems/overlayfs.html
* https://en.wikipedia.org/wiki/OverlayFS